<?php
	/**
	 * Clase que implementa funciones de usu habitual.
	 * @author Miguel Angel Villanueva Rengifo
	 * @version 0.1
	 * @package clases-generales
	 *
	 */
	class Util{
		
		public static function implode_assoc($inner_glue, $outer_glue, $array){
        	$output = array();
        	foreach( $array as $key => $item )
            	$output[] = $key . $inner_glue . $item;
 
        	return implode($outer_glue, $output);
		}
		
		/**
		* Convierte el primera caracter y cualquier caracter despues de '_' a mayuscula.
		* @param string $cadena Cadena que se modificara.
		* @return string
		*/
		public static function ConvertirNombre($cadena){
			$nombres=explode('_', $cadena);
			$cadena_nombre='';
			foreach ($nombres as $nombre)
				$cadena_nombre.=ucfirst($nombre);
			return $cadena_nombre;
		}
		
		/**
		* Codificar Arreglo asociativo a cadena en formato JSON.
		* @param array $data Arreglo asociativo que se convertira en cadena de formato JSON.
		* @return string Cadena en formato JSON.
		*/
		public static function CodificarJSON($data){
			return json_encode($data);
		}
		
		/**
		* Convertir cadena JSON en arreglo asociativo.
		* @param string $cadena Cadena en formato JSON.
		* @return array Arreglo Asociativo.
		*/
		public static function DecodificarJSON($cadena){
			return json_decode($cadena);
		}
		
		/**
		* Elimina Espacion en blanco de los estremos de una cadena.
		* @param string $cadena Cadena que se eliminaran los espcios en blanco de los extremos.
		* @return string Cadena sin espacios en blanco en los extremos.
		*/
		public static function  LimpiarEspacios($cadena){
			return trim($cadena);
		}
		
		/**
		* Convierte cadena en numero (Evitar problemas al momento de tratar una cadena en forma de numero como si fuera un numero),
		* Ejem: 000124, o cuando se convierte en otro numero.
		* @param string $numero Cadena en forma de numero.
		* @return string Cadena formateada. 
		*/
		public static function FormatearCadenaNumero($numero){
			return sprintf('%s',$numero);
		}
		
		/**
		* Obtener el contenido de una pagina en una variable.
		* @param string $url Direccion Url de la pagina de la cual se quiere recuperar el contenido.
		* @param string Contenido de la url de una variable.
		*/
		public static function getUrl($url){
			$ch = curl_init();
    		curl_setopt($ch,CURLOPT_URL,$url);
    		curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    		curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,1);
    		$content = curl_exec($ch);
    		curl_close($ch);
    		return $content;
		}
		
		/**
		* Contenido de una pagina con formato JSON convertido en un arreglo asociativo.
		* @param string $url Direccion Url
		* @return array Arreglo asociativo con el contenido de la Url.
		*/
		public static function getUrlJson($url){
			$pagina=Util::getUrl($url);
			$datos=json_decode($pagina,true);
			return $datos;
		}
		
		/**
		* convierte toda una cadena a su correspondiente en Mayusculas.
		* @param string Cadena que se convertira todo a Mayusculas.
		* @return string Cadena convertida en Mayusculas.
		*/
		public static function TodoMayusculas($cadena){
			return strtoupper($cadena);
		}
		
		/**
		 * Convierte toda la cadena a su correspondiente en Minusculas.
		 *
		 * @param string $cadena Cadena que se convertira todo a minusculas/
		 * @return string Cadena convertida.
		 */
		public function TodoMinusculas($cadena){
			return strtolower($cadena);
		}
		
		/**
		* Codificar cadena a juego de caracteres UTF8.
		* @param string Cadena a convertir a UTF8.
		* @param string Cadena convertida.
		*/
		public static function CodificarCaracteres($cadena){
			return utf8_decode($cadena);
		}
		
		/**
		* Descoficar cadena en UTF8 a juego de caracteres Nativo del Servidor.
		* @param string $cadena Cadena a convertir.
		* @return string Cadena convertida a juego de caracteres Nativo.
		*/
		public static function DecodificarCaracteres($cadena){
			return utf8_encode($cadena);
		}
		
		/**
		* Generar Archivo JPG local a partir de una imagen ubicada en una Url.
		* La imagen debe ser de tipo .jpg o .jpeg si no generar un error al momento de generar la copia local.
		* @param string $ubicacion Nombre del archivo que se generar localmente, el nombre puede contener la ruta, Ejem: fotos/00001.jpg
		* @param string $url Direccion Url de la imagen.
		*/
		public static function GenerarFileJpgUrl($ubicacion,$url){
			$im=imagecreatefromjpeg($url);
			imagejpeg($im,$ubicacion);
			imagedestroy($im);
		}
		
		/**
		 * Convierte cadena url a diccionario.
		 * Ejemplo:
		 * 		entrada:a=1&b=2&c=3
		 * 		salida: array('a'=>'1','b'=>'2','c'=>'3')
		 *
		 * @param string $url Cadena de la cual se extraera las variables y los datos.
		 * @return array Diccionario.
		 */
		public static function GetVariablesValores($url){
			//quitamos la barra del final
			$url = preg_replace('/\/$/', '', $url);
 			echo $url;
			//separamos las partes de la url y las contamos
			$partes = explode('/', $url);
			$cantPartes = count($partes);
 
			//si la cantidad de partes no es par retornamos false, al ser impar una variable se quedaria sin valor y esto no es posible
			if($cantPartes % 2 != 0)
				return false;
 
			$variables = array();
			for($c = 0; $c < $cantPartes; $c = $c + 2)
			{
				//Acumulamos los pares de valores(para nosotros variables) en el arreglo
				$nombre = Util::LimpiarUrl($partes[$c]);
				$valor = Util::LimpiarUrl($partes[$c + 1]);
				$variables[$nombre] = $valor;
			}
 
			return $variables;
		}
		
		/**
		 * Convierte cadena url amigable a un arreglo.
		 * Ejemplo:
		 * 		entrada:/a/b/c
		 * 		salida: array('1','2','3')
		 *
		 * @param string $url Cadena de la cual se extraera los datos.
		 * @return array Arreglo simple.
		 */
		public static function GetVariables($url){
			//quitamos la barra del final
			$url = preg_replace('/\/$/', '', $url);
 
			//separamos las partes/variables de la url y las contamos
			$variables = explode('/', $url);
			$cantVariables = count($variables);
 			$arreglo_variables=array();
			
			for($c = 0; $c < $cantVariables; $c++)
			{
				//Acumulamos los valores en un arreglo
				if(!empty($variables[$c])){
					$arreglo_variables[$c] = Util::LimpiarUrl($variables[$c]);
			   	}
			}
 
			return $arreglo_variables;
		}
		
		/**
		 * Filtra los caracteres de una direccion URL, elimina los caracteres especiales.
		 *
		 * @param string $url  
		 * @return string Cadena Filtrada
		 */
		public static function LimpiarUrl($url)
		{
			//permitimos solo letras(a-Z), numeros y guiones
			return preg_replace('/[^a-zA-Z0-9-_]/', '', $valor);
		}
		
		/**
		 * Corta una cadena en los primeros 'n' caracteres.
		 *
		 * @param string $cadena Cadena Original.
		 * @param integer $tamallo Numero de caracteres a cortar.
		 * @return string
		 */
		public static function CortarCadena($cadena='',$tamallo=150,$inicio=0){
			return substr($cadena,$inicio,$tamallo);
		}
		
		/**
		 * Verifica si una cadena es sub cadena de otra cadena.
		 *
		 * @param string $pajar Cadena donde se realizara la busqueda.
		 * @param string $aguja SubCadena a buscar en la cadena principal.
		 * @return bool Verdadero en caso sea subcadena, Falso en caso contrario.
		 */
		public function EsSubCadena($pajar,$aguja){
			if(strpos($pajar, $aguja)>-1)
				return true;
			else 
				return false;
		}
		
		/**
		 * Formatear la salida del Precio.
		 *
		 * @param float $cantidad 
		 * @return string
		 */
		public function FormatearPrecio($cantidad){
			return sprintf("%.2f",$cantidad);
		}
		
		/**
		 * Recuperar la fecha y hora del servidor, formato:Y-m-d H:i:s
		 *
		 * @return unknown
		 */
		public function getFechaHora(){
			return date('Y-m-d H:i:s');
		}
		
		/**
		 * Funcion para identificat si se esta usando IE como navegador
		 *
		 * @return bool Verdadero en caso sea IE, Falso en caso contrario.
		 */
		public static function EsIE(){
			$iexp = $_SERVER[HTTP_USER_AGENT]; 
			if(strstr($iexp,"MSIE")){ 
				return true;
			}else { 
				return false;
			} 
		}
		
		/**
		 * Funcion que devuelve los parametros de una URL en un arreglo,
		 * no funciona con direcciones relativas.
		 * 
		 * @example 
		 * Array
		 *	(
    	 *		[scheme] => http
    	 *		[host] => hostname
    	 *		[user] => username
    	 *		[pass] => password
    	 *		[path] => /path
    	 *		[query] => arg=value
    	 *		[fragment] => anchor
		 * 	)
		 *
		 * @param string $url Direccion URL a parsear.
		 * @return array
		 */
		public static function getParamentrosUrl($url){
			return parse_url($url);
		}
		
		public static function SubirArchivo($archivo = array(),$destino=''){
			$tamano = $archivo['size'];
			$tipo = $archivo['type'];
			$file_name = $archivo['name'];
			$extension = '';
			
			$extension = Util::getExtension($tipo);
		  	
			
						
			if (!empty($archivo)) {
				
				if ($archivo != "") {
					// guardamos el archivo a la carpeta files
					if (copy($archivo['tmp_name'],$destino.$extension)) {
						return true;
					} else {
						return false;
					}
				} else {
					return false;
				}
			}else {
				return false;
			}
		}
		
		/**
		 * Recupera la extension de un tipo de archivo.
		 *
		 * @param string $type Tipo de archivo.
		 * @return string Extension de archivo.
		 */
		public static function getExtension($type){
			$extension = '';
			//echo $type;
			switch ($type){
				case 'text/x-sql':
						$extension = '.sql';
						break;
				case 'image/gif':
						$extension = '.gif';
						break;
				case  'image/jpg':
						$extension = '.jpg';
						break;
				case 'application/msword':
						$extension = '.doc';
						break;
				case 'application/pdf':
						$extension = '.pdf';
						break;
				case 'image/png':
						$extension = '.jpg';
						break;
			}
			return $extension;
		}
		
		/**
		 * Busca la posicion de una subcadena en una cadena.
		 *
		 * @param string $pajar Cadena principal donde se realizara la busqueda.
		 * @param string $aguja Subcadena que se buscara. 
		 * @return integer
		 */
		public function UbicarSudCadena($pajar,$aguja){
			return strpos($pajar, $aguja);
		}
		
		public function RemplazarCadena($cadena_reemplazar,$cadena_reemplazada,$cadena_principal){
			return str_replace($cadena_reemplazar, $cadena_reemplazada, $cadena_principal);
		}
	}
?>
